home *** CD-ROM | disk | FTP | other *** search
- /* #[info: */
- /************************************************************************
- * *
- * #### #### ##### ##### ##### # #### *
- * # # # # # # # # # # *
- * # # # # # # # # # # *
- * ### # ## ### ##### ### ####### # # *
- * # # # # # # # # # # # *
- * # # # # # # # # # # # *
- * #### #### # # # ##### # # #### *
- * *
- * Jan van der Steen *
- * *
- * Centre for Mathematics and Computer Science *
- * Amsterdam, the Netherlands *
- * *
- *----------------------------------------------------------------------*
- * File : sgfread.c *
- * Purpose : Read and store a Smart Go Format file *
- * Version : 1.2 *
- * Modified: 12/16/92 18:34:07 *
- * Author : Jan van der Steen (jansteen@cwi.nl) *
- ************************************************************************/
- /* #]info: */
- /* #[include: */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "tools.h"
- #include "gogame.h"
- #include "sgfread.h"
-
- /* #]include: */
- /* #[define: */
-
- #define MAXLINE 1024
-
- /* #]define: */
- /* #[typedef: */
-
- #ifdef __STDC__
- # define PROTO(s) s
- #else
- # define PROTO(s) ()
- #endif
-
- typedef struct key_info {
- char * ky_long;
- char * ky_short;
- void (*ky_handle)PROTO((GOGAME *g, char *line));
- } KEY;
-
- #undef PROTO
-
- /* #]typedef: */
- /* #[prototype: */
-
- #ifdef __STDC__
- # define PROTO(s) s
- #else
- # define PROTO(s) ()
- #endif
-
- /*
- * Keyword handlers
- */
- static void do_black PROTO((GOGAME *g, char *line));
- static void do_white PROTO((GOGAME *g, char *line));
- static void do_comment PROTO((GOGAME *g, char *line));
- static void do_event PROTO((GOGAME *g, char *line));
- static void do_user PROTO((GOGAME *g, char *line));
- static void do_playerblack PROTO((GOGAME *g, char *line));
- static void do_blackranking PROTO((GOGAME *g, char *line));
- static void do_playerwhite PROTO((GOGAME *g, char *line));
- static void do_whiteranking PROTO((GOGAME *g, char *line));
- static void do_date PROTO((GOGAME *g, char *line));
- static void do_game PROTO((GOGAME *g, char *line));
- static void do_view PROTO((GOGAME *g, char *line));
- static void do_size PROTO((GOGAME *g, char *line));
- static void do_gamename PROTO((GOGAME *g, char *line));
- static void do_place PROTO((GOGAME *g, char *line));
- static void do_result PROTO((GOGAME *g, char *line));
- static void do_komi PROTO((GOGAME *g, char *line));
- static void do_addblack PROTO((GOGAME *g, char *line));
- static void do_addwhite PROTO((GOGAME *g, char *line));
- static void do_blacktimeleft PROTO((GOGAME *g, char *line));
- static void do_whitetimeleft PROTO((GOGAME *g, char *line));
-
- #undef PROTO
-
- /* #]prototype: */
- /* #[static: */
-
- static KEY key[] = {
- { "Black" , "B" , do_black },
- { "White" , "W" , do_white },
- { "Comment" , "C" , do_comment },
- { "EVent" , "EV" , do_event },
- { "USer" , "US" , do_user },
- { "PlayerBlack" , "PB" , do_playerblack },
- { "BlackRanking" , "BR" , do_blackranking },
- { "PlayerWhite" , "PW" , do_playerwhite },
- { "WhiteRanking" , "WR" , do_whiteranking },
- { "DaTe" , "DT" , do_date },
- { "GaMe" , "GM" , do_game },
- { "VieW" , "VW" , do_view },
- { "SiZe" , "SZ" , do_size },
- { "GameName" , "GN" , do_gamename },
- { "PlaCe" , "PC" , do_place },
- { "REsult" , "RE" , do_result },
- { "KoMi" , "KM" , do_komi },
- { "AddBlack" , "AB" , do_addblack },
- { "AddWhite" , "AW" , do_addwhite },
- { "BlacktimeLeft" , "BL" , do_blacktimeleft },
- { "WhitetimeLeft" , "WL" , do_whitetimeleft },
- { (char *) 0 , (char *) 0 , 0 }
- };
-
- static FILE *input;
-
- /* #]static: */
-
- /* #[do_black: */
-
- static void
- do_black(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- int i = *(line ) - 'a';
- int j = *(line+1) - 'a';
- PLACE place = i + (j * gogame->gm_size);
-
- move_store(gogame, BLACK, place);
- }
-
- /* #]do_black: */
- /* #[do_white: */
-
- static void
- do_white(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- int i = *(line ) - 'a';
- int j = *(line+1) - 'a';
- PLACE place = i + (j * gogame->gm_size);
-
- move_store(gogame, WHITE, place);
- }
-
- /* #]do_white: */
- /* #[do_addblack: */
-
- static void
- do_addblack(gogame, line)
- /*
- * Add a black stone to the game
- * TODO: Make it accept: [dp][pd][..]
- */
- GOGAME *gogame;
- char *line;
- {
- int i = *(line ) - 'a';
- int j = *(line+1) - 'a';
- PLACE place = i + (j * gogame->gm_size);
-
- move_store(gogame, BLACK, place);
- gogame->gm_movenr--;
- }
-
- /* #]do_addblack: */
- /* #[do_addwhite: */
-
- static void
- do_addwhite(gogame, line)
- /*
- * Add a white stone to the game
- * TODO: Make it accept: [dp][pd][..]
- */
- GOGAME *gogame;
- char *line;
- {
- int i = *(line ) - 'a';
- int j = *(line+1) - 'a';
- PLACE place = i + (j * gogame->gm_size);
-
- move_store(gogame, BLACK, place);
- gogame->gm_movenr--;
- }
-
- /* #]do_addwhite: */
- /* #[do_comment: */
-
- static void
- do_comment(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- char nextline[MAXLINE];
-
- if (gogame->gm_movelast == (GOMOVE *) 0) {
- fprintf(stderr, "Comment without move received (ignored)\n");
- return;
- }
- if (*line) text_store(gogame, line);
- while (fgets(nextline, MAXLINE, input) != (char *) 0) {
- if (*nextline == /*[*/ ']') return;
- nextline[strlen(nextline) - 1] = 0;
- text_store(gogame, nextline);
- }
- }
-
- /* #]do_comment: */
- /* #[do_event: */
-
- static void
- do_event(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_event = string_store(line);
- }
-
- /* #]do_event: */
- /* #[do_user: */
-
- static void
- do_user(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_user = string_store(line);
- }
-
- /* #]do_user: */
- /* #[do_playerblack: */
-
- static void
- do_playerblack(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_black = string_store(line);
- }
-
- /* #]do_playerblack: */
- /* #[do_blackranking: */
-
- static void
- do_blackranking(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_brank = string_store(line);
- }
-
- /* #]do_blackranking: */
- /* #[do_blacktimeleft: */
-
- static void
- do_blacktimeleft(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_btime = string_store(line);
- }
-
- /* #]do_blacktimeleft: */
- /* #[do_playerwhite: */
-
- static void
- do_playerwhite(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_white = string_store(line);
- }
-
- /* #]do_playerwhite: */
- /* #[do_whiteranking: */
-
- static void
- do_whiteranking(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_wrank = string_store(line);
- }
-
- /* #]do_whiteranking: */
- /* #[do_whitetimeleft: */
-
- static void
- do_whitetimeleft(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_wtime = string_store(line);
- }
-
- /* #]do_whitetimeleft: */
- /* #[do_date: */
-
- static void
- do_date(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_date = string_store(line);
- }
-
- /* #]do_date: */
- /* #[do_game: */
-
- static void
- do_game(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_game = string_store(line);
- }
-
- /* #]do_game: */
- /* #[do_view: */
-
- static void
- do_view(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_view = string_store(line);
- }
-
- /* #]do_view: */
- /* #[do_size: */
-
- static void
- do_size(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- int size = atoi(line);
-
- if (size != MAXSIZE) {
- free(gogame->gm_goban);
- gogame->gm_goban = goban_new(gogame, size);
- }
- gogame->gm_size = size;
- }
-
- /* #]do_size: */
- /* #[do_gamename: */
-
- static void
- do_gamename(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_name = string_store(line);
- }
-
- /* #]do_gamename: */
- /* #[do_place: */
-
- static void
- do_place(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_place = string_store(line);
- }
-
- /* #]do_place: */
- /* #[do_result: */
-
- static void
- do_result(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_result = string_store(line);
- }
-
- /* #]do_result: */
- /* #[do_komi: */
-
- static void
- do_komi(gogame, line)
- GOGAME *gogame;
- char *line;
- {
- gogame->gm_komi = string_store(line);
- }
-
- /* #]do_komi: */
-
- /* #[sgf_read: */
-
- GOGAME *
- sgf_read(fp)
- FILE *fp;
- {
- GOGAME * gogame = (GOGAME *) 0;
- KEY * k;
- char line[MAXLINE];
- char * o_bracket;
-
- input = fp;
- while (fgets(line, MAXLINE, fp) != (char *) 0) {
- /*
- * First try one character directives
- */
- switch (*line) {
- case '(': if (gogame == (GOGAME *) 0) {
- gogame = game_alloc();
- } else {
- fprintf(stderr, "Recursive game encountered!\n");
- exit(1);
- }
- continue;
- case ';': continue;
- case ')': return gogame;
- default: break;
- }
- /*
- * Next try keywords
- */
- if (gogame == (GOGAME *) 0) continue;
- line[strlen(line) - 1] = 0;
- o_bracket = strchr(line, '['/*]*/);
- if (!o_bracket) {
- fprintf(stderr,
- "No opening bracket in line: \"%s\"\n", line);
- continue;
- }
- *o_bracket = 0;
- for (k = key; k->ky_long != (char *) 0; k++) {
- if (!strncmp(line, k->ky_long , strlen(line)) ||
- !strncmp(line, k->ky_short, strlen(line))) {
- if (k->ky_handle) {
- char *c_bracket = strchr(o_bracket+1, /*[*/']');
-
- if (c_bracket) *c_bracket = 0;
- (k->ky_handle)(gogame, o_bracket+1);
- break;
- } else fprintf(stderr, "Not supported: \"%s\"\n", line);
- }
- }
- }
- if (gogame != (GOGAME *) 0) {
- fprintf(stderr, "sgf_read(): EOF encountered before End Of Game\n");
- game_free(gogame);
- gogame = (GOGAME *) 0;
- }
- return gogame;
- }
-
- /* #]sgf_read: */
-
-